﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LAPI.Business.Acciones
{   

    /// <summary>
    /// Clase para estandarizar la comunicación entre controlador y acciones de negocio
    /// </summary>
    public class ResultadoAccion
    {
        private System.Collections.Generic.List<MensajeAccion> mensajes;
        private TipoResultado resultado;

        /// <summary>
        /// Constructor
        /// </summary>
        public ResultadoAccion() { 
        
            this.mensajes = new System.Collections.Generic.List<MensajeAccion>();
        }
       
        /// <summary>
        /// Agregar un mensaje al resultado de la acción
        /// </summary>
        /// <param name="mensaje">mensaje a agregar</param>
        /// <param name="tipoMensaje">tipo de mensaje</param>
        public void addMensaje(String mensaje, TipoMensaje tipoMensaje){                      

            mensajes.Add(new MensajeAccion(mensaje: mensaje, tipoMensaje: tipoMensaje));
        }

        /// <summary>
        /// Método para obtener los mensajes del resultado de la acción
        /// </summary>
        /// <returns></returns>
        public System.Collections.Generic.List<MensajeAccion> getMensajes()
        {
            return mensajes;
        }

        /// <summary>
        /// Método para establecer el resultado de la acción
        /// </summary>
        /// <param name="resultado">resultado de la acción</param>
        public void setResultado(TipoResultado resultado)
        {
            this.resultado = resultado;
        }

        /// <summary>
        /// Método para obtener le resultado de la acción
        /// </summary>
        /// <returns></returns>
        public TipoResultado getResultado()
        {
            return this.resultado;
        }

        /// <summary>
        /// Método para convertir el resultado de una acción, en JSON, para las acciones 
        /// que son de tipo servicio Web o llamada asíncrona
        /// </summary>
        /// <returns></returns>
        public System.String ResultadoToJson()
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            System.IO.StringWriter sw = new System.IO.StringWriter(sb);

            using (Newtonsoft.Json.JsonWriter jsonWriter = new Newtonsoft.Json.JsonTextWriter(sw))
            {
                jsonWriter.Formatting = Newtonsoft.Json.Formatting.Indented;

                jsonWriter.WriteStartObject();
                jsonWriter.WritePropertyName("operation");

                if (this.getResultado() == Business.Acciones.TipoResultado.CORRECTO)
                    jsonWriter.WriteValue("OK");

                else if (this.getResultado() == Business.Acciones.TipoResultado.ERROR)
                    jsonWriter.WriteValue("FAIL");

                else if (this.getResultado() == Business.Acciones.TipoResultado.REDIRECCION)
                    jsonWriter.WriteValue("REDIRECTION");

                jsonWriter.WritePropertyName("messages");
                jsonWriter.WriteStartArray();

                foreach (LAPI.Business.Acciones.MensajeAccion item in this.getMensajes())
                {
                    jsonWriter.WriteValue(item.mensaje);
                }

                jsonWriter.WriteEndArray();
                jsonWriter.WritePropertyName("styles");
                jsonWriter.WriteStartArray();

                foreach (LAPI.Business.Acciones.MensajeAccion item in this.getMensajes())
                {
                    if (item.tipoMensaje == Business.Acciones.TipoMensaje.INFORMACION)
                        jsonWriter.WriteValue("INFORMATION");
                    else if (item.tipoMensaje == Business.Acciones.TipoMensaje.OK)
                        jsonWriter.WriteValue("SUCESFULLY");
                    else if (item.tipoMensaje == Business.Acciones.TipoMensaje.ALERTA)
                        jsonWriter.WriteValue("WARNING");
                    else if (item.tipoMensaje == Business.Acciones.TipoMensaje.ERROR)
                        jsonWriter.WriteValue("ERROR");
                }
                jsonWriter.WriteEndArray();
                jsonWriter.WriteEndObject();

                jsonWriter.Flush();
            }

            return sb.ToString();
        }
    }

    /// <summary>
    /// Enumerado, con los tipos de resultado disponibles en LAPI
    /// </summary>
    public enum TipoResultado
    {
        CORRECTO,
        ERROR,
        CON_ALERTAS,
        REDIRECCION,
        CORRECTO_REDIRECCION
    }

    /// <summary>
    /// Enumerado, con los tipos de mensajes disponibles en LAPI
    /// </summary>
    public enum TipoMensaje
    {

        ERROR,
        ALERTA,
        INFORMACION,
        OK,
        REDIRECCION
    }

    /// <summary>
    /// Clase que representa el mensaje de intercambio de información con una acción
    /// </summary>
    public class MensajeAccion
    {
        /// <summary>
        /// Mensaje
        /// </summary>
        public String mensaje { set; get; }

        /// <summary>
        /// Tipo de mensaje
        /// </summary>
        public TipoMensaje tipoMensaje { set; get; }

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="mensaje">Mensaje</param>
        /// <param name="tipoMensaje">Tipo de mensaje</param>
        public MensajeAccion(String mensaje, TipoMensaje tipoMensaje)
        {
            this.mensaje = mensaje;
            this.tipoMensaje = tipoMensaje;
        }
    }  
}
